home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 221_01 / cc21.c < prev    next >
Text File  |  1980-01-01  |  13KB  |  504 lines

  1. /* >>>>>> start of cc2 <<<<<<<< */
  2. /*     */
  3. /* Get required array size  */
  4. /*     */
  5. /* invoked when declared variable is followed by "[" */
  6. /* this routine makes subscript the absolute */
  7. /* size of the array. */
  8. needsub()
  9.  {
  10.  int num[1];
  11.  if(match("]"))return (0); /* null size */
  12.  if (number(num)==0) /* go after a number */
  13.   {errrpt("must be constant"); /* it isn't */
  14.   num[0]=1;  /* so force one */
  15.   }
  16.  if (num[0]<0)
  17.   {errrpt("negative size illegal");
  18.   num[0]=(-num[0]);
  19.   }
  20.  needbrack("]");  /* force single dimension */
  21.  return (num[0]);  /* and return size */
  22.  }
  23. /*     */
  24. /* Begin a function  */
  25. /*     */
  26. /* Called from "parse" this routine tries to make a function */
  27. /* out of what follows. */
  28. newfunc(class) int class; {
  29. /* next lines added by dieter flunkert 23 jan 1986 */
  30.  int argtop;  /* top of argument stack */
  31.  char n[namesize],*ptr;
  32. #ifdef STGOTO
  33.   nogo=noloc=0;
  34. #endif
  35. #ifdef PHASE2
  36.   if(monitor) {cout('\n',stderr);sout(line,stderr);}
  37. #endif
  38.  if (symname(n)==0)
  39.   {errrpt("illegal function or declaration");
  40.   kill(); /* invalidate line */
  41.   return;
  42.   }
  43.  if(ptr=findglb(n)) /* already in symbol table ? */
  44.   {if(ptr[ident]!=function)multidef(n);
  45.    /* already variable by that name */
  46.   else if(ptr[offset]==function)multidef(n);
  47.    /* already function by that name */
  48.   else ptr[offset]=function;
  49.    /* otherwise we have what was earlier*/
  50.    /*  assumed to be a function */
  51.   }
  52.  /* if not in table, define as a function now */
  53.  else addglb(n,function,cint,function);
  54.  /* we had better see open paren for args... */
  55.  if(match("(")==0)errrpt("missing open paren");
  56. /* next lines added by dieter flunkert 23 jan 1986 */
  57.  if(first_func) {
  58.    defname(n);  /* define name of asm module */
  59.    first_func = 0;
  60.  }
  61.  entry(n, class);
  62.  if(DEFDEBUG) debug(n);
  63.      /* ** Clear local stack pointer rev. 1P */
  64.  locptr = startloc; /* ** 2 lines inserted  rev. 1P */
  65.  argstk=0;  /* init arg count */
  66.  while(match(")")==0) /* then count args */
  67.   /* any legal name bumps arg count */
  68.   {if(symname(n)) /* **+ Modification  rev. 1P */
  69.    { if (findloc(n)) multidef(n);
  70.    else { addloc(n, 0, 0, argstk);
  71.     argstk = argstk + 2;
  72.    }
  73.   }  /* **- End of modification rev. 1P */
  74.   else{errrpt("illegal argument name");junk();}
  75.   blanks();
  76.   /* if not closing paren, should be comma */
  77.   if(streq(line+lptr,")")==0)
  78.    {if(match(",")==0)
  79.    errrpt("expected comma");
  80.    }
  81.   if(endst())break;
  82.   }
  83. /* ** Next line deleted      rev. 1P */
  84. /* ** locptr=startloc; ** */ /* "clear" local symbol table*/
  85.  stkp=0;   /* preset stack ptr */
  86. /* next line added by dieter flunkert 23 jan 1986 */
  87.  argtop=argstk; /* save top of argument stack */
  88.  while(argstk)
  89.   /* now let user declare what types of things */
  90.   /* those arguments were */
  91.   {if(amatch("char",4)){getarg(argtop,cchar);ns();}
  92.   else if(amatch("int",3)){getarg(argtop,cint);ns();}
  93.   else{errrpt("wrong number args");break;}
  94.   }
  95.  if(statement()!=streturn) /* do a statement, but if */
  96.     /* it's a return, skip */
  97.     /* cleaning up the stack */
  98.   {modstk(0);
  99.   ret();
  100.   }
  101.  stkp=0;   /* reset stack ptr again */
  102.  locptr=startloc; /* deallocate all locals */
  103.  if(litptr) {     /* dump literal pool */
  104.    printlabel(litlab);
  105.    dumplits(1);
  106.    litlab=getlabel();
  107.    }
  108.  }
  109.  
  110. /*     */
  111. /* Declare argument types  */
  112. /*     */
  113. /* called from "newfunc" this routine adds an entry in the */
  114. /* local symbol table for each named argument */
  115. /* ** Function completely rewritten rev. 1P */
  116. /* modified by dieter flunkert 23 jan 1986 */
  117. /* argtop is not allowed to change value. This was the case
  118.  if a function had a declaration like:
  119.    int i; char c; */
  120. getarg(argtop,t)  /* t = cchar or cint */
  121.  int argtop,t;
  122.  {
  123.  int j, legalname, address;
  124.  char n[namesize], c, *argptr;
  125. /* next line deleted by dieter flunkert 23 jan 1986  */
  126. /* argtop = argstk; */
  127.  while(1)
  128.   {if(argstk==0)return; /* no more args */
  129.   if(match("*"))j=pointer;
  130.    else j=variable;
  131.   if((legalname = symname(n)) == 0) illname();
  132.   if(match("[")) /* pointer ? */
  133.   /* it is a pointer, so skip all */
  134.   /* stuff between "[]" */
  135.    {while(inbyte()!=']')
  136.     if(endst())break;
  137.    j=pointer;
  138.    /* add entry as pointer */
  139.    }
  140.   if (legalname) {
  141.    if (argptr = findloc(n)) {
  142.    /*  Add in details of the type and address of */
  143.    /* the name  */
  144.    argptr[ident] = j;
  145.    argptr[type] = t;
  146.    address = argtop - (argptr[offset] + (argptr[offset+1]<<8));
  147.    putint(address, argptr+offset, offsize);
  148.    }
  149.   else errrpt("Expected argument name");
  150.   }
  151.   argstk=argstk-2; /* cnt down */
  152.   if (endst()) return;
  153.   if (match(",") == 0) errrpt("expected comma");
  154.   }
  155.  }
  156. /* ** End of modifications rev. 1P */
  157.  
  158. /*
  159. ** statement parser
  160. **
  161. ** called whenever syntax requires a statement
  162. **  this routine performs that statement
  163. **  and returns a number telling which one
  164. */
  165. statement() {
  166. int class;
  167.  
  168.   if ((ch==0) && (eof)) return;
  169.   if(amatch("static",6)) {
  170.    class=statik;
  171.    if(++stdecl == 1)  /* there are static variables */
  172.        jump(stlab=getlabel()); /* skip static declarations */
  173.   }
  174.   else class=stkloc;
  175.   if(amatch("char",4))  {declloc(cchar,class);ns();}
  176.   else if(amatch("int",3))   {declloc(cint,class);ns();}
  177.   else {
  178.     if(stdecl > 0) {
  179.       postlabel(stlab);
  180.       stdecl = 0;
  181.     }
  182.     if(declared >= 0) {
  183. #ifdef STGOTO
  184.       if(ncmp > 1) nogo=declared; /* disable goto if any */
  185. #endif
  186.       stkp=modstk(stkp - declared);
  187.       declared = -1;
  188.       }
  189.     if(match("{"))               compound();
  190.     else if(amatch("if",2))      {doif();lastst=stif;}
  191.     else if(amatch("while",5))   {dowhile();lastst=stwhile;}
  192. #ifdef STDO
  193.     else if(amatch("do",2))      {dodo();lastst=STDO;}
  194. #endif
  195. #ifdef STFOR
  196.     else if(amatch("for",3))     {dofor();lastst=STFOR;}
  197. #endif
  198. #ifdef STSWITCH
  199.     else if(amatch("switch",6))  {doswitch();lastst=STSWITCH;}
  200.     else if(amatch("case",4))    {docase();lastst=STCASE;}
  201.     else if(amatch("default",7)) {dodefault();lastst=STDEF;}
  202. #endif
  203. #ifdef STGOTO
  204.     else if(amatch("goto", 4))   {dogoto(); lastst=STGOTO;}
  205.     else if(dolabel())           lastst=STLABEL;
  206. #endif
  207.     else if(amatch("return",6))  {doreturn();ns();lastst=streturn;}
  208.     else if(amatch("break",5))   {dobreak();ns();lastst=stbreak;}
  209.     else if(amatch("continue",8)){docont();ns();lastst=stcont;}
  210.     else if(match(";"))          ;
  211.     else if(match("#asm"))       {doasm();lastst=stasm;}
  212.     else                         {doexpression();ns();lastst=stexp;}
  213.     }
  214.   return lastst;
  215.   }
  216.  
  217. #ifdef STDO
  218. dodo() {
  219.   int wq[4], top;
  220.   addwhile(wq);
  221.   postlabel(top=getlabel());
  222.   statement();
  223.   needbrack("while");
  224.   postlabel(wq[wqloop]);
  225.   test(wq[wqlab],YES);
  226.   jump(top);
  227.   postlabel(wq[wqlab]);
  228.   delwhile();
  229.   ns();
  230.   }
  231. #endif
  232.  
  233. #ifdef STFOR
  234. dofor() {
  235.   int wq[4], lab1, lab2;
  236.   addwhile(wq);
  237.   lab1=getlabel();
  238.   lab2=getlabel();
  239.   needbrack("(");
  240.   if(match(";")==0) {
  241.     doexpression();            /* expr 1 */
  242.     ns();
  243.     }
  244.   postlabel(lab1);
  245.   if(match(";")==0) {
  246.     test(wq[wqlab],NO); /* expr 2 */
  247.     ns();
  248.     }
  249.   jump(lab2);
  250.   postlabel(wq[wqloop]);
  251.   if(match(")")==0) {
  252.     doexpression();            /* expr 3 */
  253.     needbrack(")");
  254.     }
  255.   jump(lab1);
  256.   postlabel(lab2);
  257.   statement();
  258.   jump(wq[wqloop]);
  259.   postlabel(wq[wqlab]);
  260.   delwhile();
  261.   }
  262. #endif
  263.  
  264. #ifdef STSWITCH
  265. doswitch() {
  266.   int wq[4], endlab, swact, swdef, *swnex, *swptr;
  267.   swact=swactive;
  268.   swdef=swdefault;
  269.   swnex=swptr=swnext;
  270.   addwhile(wq);
  271.   needbrack("(");
  272.   doexpression();      /* evaluate switch expression */
  273.   needbrack(")");
  274.   swdefault=0;
  275.   swactive=1;
  276.   jump(endlab=getlabel());
  277.   statement();   /* cases, etc. */
  278.   jump(wq[wqlab]);
  279.   postlabel(endlab);
  280.   sw();          /* match cases */
  281.   while(swptr < swnext) {
  282.     defstorage(cint>>2);
  283.     printlabel(*swptr++);  /* case label */
  284.     outbyte(',');
  285.     outdec(*swptr++);      /* case value */
  286.     nl();
  287.     }
  288.   defstorage(cint>>2);
  289.   outdec(0);
  290.   nl();
  291.   if(swdefault) jump(swdefault);
  292.   postlabel(wq[wqlab]);
  293.   delwhile();
  294.